package com.itbaizhan.myshiro.controller;

import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresGuest;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/*测试鉴权过虑器
* 这里如果用@Controller,如果在templates文件件夹中没有对应路径的html,浏览器会报500错误
* 如果用@RestController，可以在浏览器显示return的文字，因为@RestController会以Json字符串的形式返回给客户端*/
//@Controller
//权限不足时跳转的页面在shiroConfig的类中shiroFilterFactoryBean配置页面
@RestController
public class PermissionController {
    /*登录后访问：*/
    @GetMapping("/reportform/find")
    public String findReportform(){
        return "查询报表";
    }

    @GetMapping("/salary/find")
    public String findSalary(){
        return "查询工资";
    }

    @GetMapping("/staff/find")
    public String findStaff(){
        return "查询员工";
    }


    /*访问前要把配置类的filterMap.put("/**","user");注释，因为项目运行时，配置类也运行，会进行拦截*/
    @GetMapping("/test/index")
    @RequiresGuest
    public String testIndex(){
        return "访问首页";
    }
    @GetMapping("/test/user")
    @RequiresUser
    public String testUser(){
        return "用户中心";
    }
    @GetMapping("/test/pay")
    @RequiresAuthentication
    public String testPay(){
        return "支付中心";
    }
    @GetMapping("/tax/find")
    @RequiresPermissions("/tax/find")
    public String testTax(){
        return "查询税务";
    }
    @GetMapping("/address/find")
    @RequiresPermissions("/address/find")
    public String testAddress(){
        return "查询地址";
    }
}


/*除了过滤器，Shiro也提供了一些鉴权的注解。我们可以使用注解配置鉴权。

@RequiresGuest：不认证即可访问的资源。

@RequiresUser：通过登录方式或“记住我”方式认证后可以访问资源。

@RequiresAuthentication：通过登录方式认证后可以访问资源。

@RequiresRoles：认证用户拥有特定角色才能访问的资源

@RequiresPermissions：认证用户拥有特定权限才能访问的资源

1在配置类开启Shiro注解

// 开启shiro注解的支持
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
  AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
  advisor.setSecurityManager(securityManager);
  return advisor;
}

// 开启aop注解支持
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
  DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
  defaultAAP.setProxyTargetClass(true);
  return defaultAAP;
}

2在控制器方法上添加鉴权注解

@GetMapping("/test/index")
@RequiresGuest
public String testIndex() {
  return "访问首页";
}
*/

/*@RestController 是@controller和@ResponseBody 的结合

@Controller 将当前修饰的类注入SpringBoot IOC容器，使得从该类所在的项目跑起来的过程中，这个类就被实例化。
@ResponseBody 它的作用简短截说就是指该类中所有的API接口返回的数据，甭管你对应的方法返回Map或是其他Object，它会以Json字符串的形式返回给客户端
*/

